home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / tccurses.lzh / STRGET.C < prev    next >
C/C++ Source or Header  |  1987-09-07  |  6KB  |  180 lines

  1. /****************************************************************/
  2. /* Getstr() routines of the PCcurses package            */
  3. /*                                */
  4. /****************************************************************/
  5. /* This version of curses is based on ncurses, a curses version    */
  6. /* originally written by Pavel Curtis at Cornell University.    */
  7. /* I have made substantial changes to make it run on IBM PC's,    */
  8. /* and therefore consider myself free to make it public domain.    */
  9. /*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  10. /****************************************************************/
  11. /* 1.0:    Release:                    870515    */
  12. /****************************************************************/
  13.  
  14. #include <curses.h>
  15. #include <curspriv.h>
  16.  
  17. static    char    *backchar();
  18.  
  19. static    bool     oldecho;
  20. static    bool     oldcbreak;
  21. static  bool     oldnodelay;
  22. static    char    *strbeg;
  23. static    WINDOW  *w;
  24. static    int     xbeg;
  25.  
  26. /****************************************************************/
  27. /* Wgetstr(win,str) reads in a string (terminated by \n or \r)    */
  28. /* to the buffer pointed to by 'str', and displays the input    */
  29. /* in window 'win'. The user's erase and kill characters are    */
  30. /* active.                            */
  31. /****************************************************************/
  32.  
  33. int wgetstr(win,str)
  34.   WINDOW    *win; 
  35.   char        *str;
  36.   {
  37.   w          = win;
  38.   strbeg      = str;        /* keep start for backspacing */
  39.   oldcbreak       = _cursvar.cbreak;    /* remember states */
  40.   oldecho         = _cursvar.echo;
  41.   oldnodelay      = w->_nodelay;
  42.   _cursvar.echo   = FALSE;        /* we do echo ourselves */
  43.   _cursvar.cbreak = TRUE;        /* no wait for chars */
  44.   w->_nodelay   = FALSE;        /* don't return 'NOCHARS' */
  45.   xbeg = w->_curx;            /* remember screen start x-position */
  46.  
  47.   wrefresh(w);                /* sets cursor at right place */
  48.   while ((*str = getch()) != '\n')
  49.     {
  50.     if (*str == '\r')
  51.       break;
  52.     if (*str == _DCCHAR)
  53.       {
  54.       if (str > strbeg)
  55.     str = backchar(str);
  56.       } /* if */
  57.     else
  58.       if (*str == _DLCHAR)
  59.     while (str > strbeg)
  60.       str = backchar(str);
  61.       else
  62.     {
  63.     waddch(w,*str++);
  64.     wrefresh(w);
  65.     } /* else */
  66.       } /* while */
  67.  
  68.   *str = '\0';
  69.   _cursvar.echo   = oldecho;
  70.   _cursvar.cbreak = oldcbreak;
  71.   win->_nodelay   = oldnodelay;
  72.   return(OK);
  73.   } /* wgetstr */
  74.  
  75. /****************************************************************/
  76. /* Getstr(str) reads in a string (terminated by \n or \r) to    */
  77. /* the buffer pointed to by 'str', and displays the input in    */
  78. /* stdscr. The user's erase and kill characters are active.    */
  79. /****************************************************************/
  80.  
  81. int getstr(str)
  82.   char *str;
  83.   {
  84.   return(wgetstr(stdscr,str));
  85.   } /* getstr */
  86.  
  87. /****************************************************************/
  88. /* Mvgetstr(y,x,str) moves the stdscr cursor to a new position,    */
  89. /* then reads in a string (terminated by \n or \r) to the buf-    */
  90. /* fer pointed to by 'str', and displays the input in stdscr.    */
  91. /* The user's erase and kill characters are active.        */
  92. /****************************************************************/
  93.  
  94. int mvgetstr(y,x,str)
  95.   int y;
  96.   int x;
  97.   char *str;
  98.   {
  99.   if (wmove(stdscr,y,x) == ERR)
  100.     return(ERR);
  101.   return(wgetstr(stdscr,str));
  102.   } /* mvgetstr */
  103.  
  104. /****************************************************************/
  105. /* Mvwgetstr(win,y,x,str) moves the 'win' cursor to a new    */
  106. /* position, then reads in a string (terminated by \n or \r)    */
  107. /* to the buffer pointed to by 'str', and displays the input in    */
  108. /* stdscr. The user's erase and kill characters are active.    */
  109. /****************************************************************/
  110.  
  111. int mvwgetstr(win,y,x,str)
  112.   WINDOW *win;
  113.   int      y;
  114.   int      x;
  115.   char     *str;
  116.   {
  117.   if (wmove(win,y,x) == ERR)
  118.     return(ERR);
  119.   return(wgetstr(win,str));
  120.   } /* mvwgetstr */
  121.  
  122. /****************************************************************/
  123. /* Backchar() does a character delete with screen erase, even    */
  124. /* up to previous lines. It will not back-scroll if the begi-    */
  125. /* ning of the string has scrolled off the window. Steps back    */
  126. /* pointer 's', and returns the new value.            */
  127. /****************************************************************/
  128.  
  129. static char *backchar(s)
  130.   char      *s;
  131.   {
  132.   static int nbs;
  133.   static int x;
  134.   static char *p;
  135.   static int ts;
  136.  
  137.   x =  xbeg;
  138.   ts =  w->_tabsize;
  139.  
  140.   s--;                        /* step back string */
  141.   nbs = 1;                    /* step at least one pos */
  142.   if ((*s < ' ') || (*s == 0x7f))        /* ctrl-char has size 2 */
  143.     nbs++;
  144.   if (*s == '\t')                /* tabs are very special */
  145.     {
  146.     for (p = strbeg; p < s ;p++)        /* find x-pos of last char */
  147.       {
  148.       if (*p == '\t')                /* go to next tab */
  149.     x = ((x/ts)+1) * ts;
  150.       else
  151.     if ((*p < ' ') || (*p == 0x7f))        /* control character */
  152.       x += 2;
  153.     else                    /* normal char */
  154.       x++;
  155.       if (x > w->_maxx)                /* go to next line? */
  156.     x = 0;
  157.       } /* while */
  158.     if (!(w->_curx))                /* if step-over newline */
  159.       nbs = w->_maxx+1 - x;
  160.     else                    /* in-line tab */
  161.       nbs = w->_curx - x;            /* positions to erase */
  162.     } /* if */
  163.  
  164.   while(nbs--)                    /* do so many */
  165.     {
  166.     if (w->_curx > 0)                /* if not at line begining */
  167.       waddstr(w,"\b \b");
  168.     else
  169.       if (w->_cury)                /* if not on top line */
  170.     {
  171.     mvwaddch(w,w->_cury-1,w->_maxx,' ');    /* put space at line end */
  172.     wmove(w,w->_cury-1,w->_maxx);        /* and go there again */
  173.     } /* else */
  174.     } /* while */
  175.  
  176.   wrefresh(w);                    /* redraw screen */
  177.   *(s+1) = '\0';                /* make string terminated */
  178.   return(s);
  179.   } /* backchar */
  180.